import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.export.*;
import net.sf.jasperreports.engine.util.*;
import java.util.*;
import java.sql.*;


//* Parametres /
//		file: nom del report
//		type: tipus de la sortida (html,pdf)
//
//* Init parametes (o fitxer properties)
//      username/password/driver/url: per crear la connexio
//		encoding
//		path_imatges


public class ViewReport extends HttpServlet {

	String driver;
	String username;
	String password;
	String url;
	String datasource;
	String path_imatges;
	String path_reports;
	String encoding;
	
	public void init() {
		
		ServletConfig cfg = getServletConfig();
		driver=cfg.getInitParameter("driver");
		username=cfg.getInitParameter("username");
		password=cfg.getInitParameter("password");		
		url=cfg.getInitParameter("url");

		encoding=cfg.getInitParameter("encoding");
		path_imatges=cfg.getInitParameter("path_imatges");
		
		ServletContext ctx = getServletContext();
		path_reports=ctx.getRealPath("/WEB-INF/classes/");
		System.out.println("username: "+username+".");
		System.out.println("Url: "+url+".");

		// Mirem a veure si tenim un Datasource
			
		try {
			// DriverManager.classForName(driver);
			DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
		} catch (SQLException ex2) {
			System.out.println("No tenim ni DataSource ni res de res");
		}
	}
	
	public void doGet(HttpServletRequest request,
            HttpServletResponse response)
	throws IOException, ServletException
	{
		Connection conn=null;
		try {
		// Parametres necessaris
		
		String file=request.getParameter("file");
		String type=request.getParameter("type");
		String usu=request.getParameter("usu");
		
		Properties properties = new Properties();
		if (usu!=null) {
			// 	Si trobem el fitxer, matxaquem els valors del web.xml
			properties.load(new FileInputStream(path_reports+"/"+usu+".properties"));

			String driver2=properties.getProperty("driver");
			if (driver2!=null) driver=driver2;
			String username2=properties.getProperty("username");
			if (username2!=null) username=username2;
			String password2=properties.getProperty("password");
			if (password2!=null) password=password2;
			String url2=properties.getProperty("url");
			if (url2!=null) url=url2;
			String encoding2=properties.getProperty("encoding");
			if (encoding2!=null) encoding=url2;
			String path_imatges2=properties.getProperty("path_imatges");
			if (path_imatges2!=null) path_imatges=path_imatges2;
							
		}

				
		JasperReport jasperReport =
			(JasperReport) JRLoader.loadObject(path_reports+"/"+file);

		// Resta de parametres que hem de passar

		Map parameters = new HashMap();
		Enumeration e=request.getParameterNames();
		String nom;
		while (e.hasMoreElements()) {
		      nom=(String)(e.nextElement());
		      parameters.put(nom,request.getParameter(nom));
		}

		// get a database connection
		
		conn=DriverManager.getConnection (url,username,password);
		System.out.println("Connectant amb "+username);

		// Creem el report

		JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, conn);
		conn.close();
		
		// Exportem al format que ens diguin

		if ("pdf".equals(type)) {
			// Versio amb stream. No ho fem servir perque no podem enviar el
			// content-length.
			// response.setContentType("application/pdf");
			// JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());
			
			// Versio generant primer un fitxer
			
			String tmp=path_reports+System.currentTimeMillis();
			JasperExportManager.exportReportToPdfFile(jasperPrint,tmp);

			OutputStream out=response.getOutputStream();
			response.setContentType("application/pdf");

			// Mirem la mida del fitxer
			File f=new File(tmp);
			response.setHeader("Content-length",""+f.length());
			
			// I ara escupim el fitxer tal qual l'hem generat

			InputStream in = new BufferedInputStream(new FileInputStream(tmp));

			int len;
			int buffer_size=10000;
			byte [] charBuff=new byte[buffer_size];			
			
			while ((len=in.read(charBuff,0,buffer_size) )!= -1)
			 out.write(charBuff,0,len);

			in.close();
			
			// I esborrem el fitxer
			f.delete(); 
		}

		if ("html".equals(type)) {
			response.setContentType("text/html");
		    JRHtmlExporter exporter = new JRHtmlExporter();
		    exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
		    exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, response.getWriter());
		    exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI,path_imatges);
		    exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING,encoding);
		    exporter.exportReport();
		}
		
		// I tanquem i ja esta tot.
		
		} catch (Exception e) {
			response.setContentType("text/plain");
			PrintWriter out=response.getWriter();
			out.println("View Report versio 7/5/2005 - 12:07");
			e.printStackTrace(out);
			out.flush();
			return;
		} finally {
			if (conn!=null) try{conn.close();}catch(Exception e){;};
		}

	}
}
